# -*-codeing = utf-8 -*-
# @Time: 2025/7/8 9:13
# @Author : 邓佳丽
# @File : 020708.py
# @Software : PyCharm
#系统模块
'''import sys
print(sys.version)   #字符串
print(sys.version[0])

print(sys.version_info)
print(type(sys.version_info)) #对象
print(sys.version_info.major)
print(sys.version_info.minor)
print(sys.version_info.micro)

print(sys.argv)

sys.exit()  #程序运行到此处，后面的程序不会被执行
print('~~~')
'''
import random

from python import mymodel1

#自定义模块
#自己定义的模块，可以在不同文件中调用

#搜索模块
'''step1 当前路径寻找
step2 sys.path：提供的路径查找，也可以给path添加元素
      sys.path.append("d://soft")
step3 查找内置模块
一个模块被导入，他的所有的程序都会执行一遍，无论他是否使用
模块再次导入时，内容不会被再此执行
'''
'''import sys
print(sys.path)
print(sys.path.append('D://soft'))   #将路径加入到py中
import test    #导入新加的文件
print(type(sys.path))
'''
#导入模块的执行过程
'''step1 去搜索路径下选择模块（.py）
   step2 判断一下是否有该模块对应的.pyc文件，如果有，而且pyc比python文件新
         直接加载文件
         如果没有或者不是最新的，就先生成pyc文件，在加载
   pyc文件是python的二进制文件，是py文件编译后的文件，是字节码文件，用来解释执行，而且是跨平台的
  '''

#模块的常用属性
'''import math
print(math.__doc__)
import mymodel1
print(mymodel1.__doc__)

#print(math.__file__)     #内置模块没有这个属性
print(mymodel1.__file__)  #自定义模块，记录模块的路径名

import numpy as np
print(np.__file__)   #第三方模块，有属性，记录模块所在包的init文件

print('~~~~~~')
print(__name__)
print(math.__name__)
print(mymodel1.__name__)
print(np.__name__)
print('~~~~~~')
#print(__all__)  #当前没
print(np.__all__)     #存储一个模块中可以被导出的属性
'''

#模块的隐藏属性
 #在模块中，以_开头的属性，在使用from，不会被导入
from mymodel1 import *
'''print(mymodel1.__all__)
import mymodel1
print(mymodel1.__all__)
'''

#random模块
# random.random()  随机生成0~1的浮点数
# random.random()*100
# random.uniform(a,b)  随机生成a~b之间的浮点数，ab大小没有要求
# random.randint(a,b)  随机生成a~b之间的整数
# random.randrange([start],[stop],[step])  随机得到一个整数，中括号可写可不写
# random.choice(sequence)  从序列中随机得到一个元素
# random.shuffle(x)   将一个列表的元素随机打乱
# random.sample(sequence,n)  随机从序列中截取部分内容，并打乱

# print(random.random()*100)
# print(random.uniform(2,1))
# print(random.randint(3,6))
# L=[1,4,245,6,2]
#  print(random.choice(L))
# random.shuffle(L)
# print(L)
# print(random.sample(L,2))

#1，猜数字，程序随机生成一个0~100的随机整数，以循环的方式让用户来猜，
#共10次猜的机会，每一次给出猜大了，猜小了，猜对了的提示，猜对时停止循环

# num=random.randint(0,101)
# flag=True
# for i in range(10):
#     guess_num=int(input('第i次猜0-100之间的数字：'))
#     if guess_num<num:
#         print('猜小啦！重新猜')
#     elif guess_num>num:
#         print('猜大啦！重新猜')
#     elif guess_num==num:
#         print('成功啦！')
#         flag=False
#         break
# if flag:
#     print('十次都没猜对哦')

#2、模拟斗地主的发牌逻辑
#一共54个牌，三个人，每人17张牌，另外保留三张底牌
#kind = ["\u2660","\u2663","\u2665","\u2666"]
'''kind = ["\u2660","\u2663","\u2665","\u2666"]
ranks = ['3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A', '2']
#deck=[f"{i}{j}" for i in kind for j in ranks]
deck = [i+j for i in kind for j in ranks]+['大王']+['小王']
random.shuffle(deck)
input('按回车给第一个人发牌；')
player1=deck[0:17]
print(player1)
input('按回车给第二个人发牌；')
player2=deck[17:34]
print(player2)
input('按回车给第三个人发牌；')
player3=deck[34:51]
print(player3)
dipai=deck[51:]
print('三张底牌是：')
print(dipai)
'''

#包package
#包是将模块以文件夹的形式进行分组管理的方法

#错误和异常
#当异常发生时，程序不会再往下继续执行，而是转去调用的地方等待处理
# try except
# try finally

'''try:
    程序片段
except:错误类型[as 别名]
    处理语句
except:错误类型[as 别名]
    处理语句
......
else:
    未发生异常执行的语句
finally:
    最终执行的语句
except：一个或多个，else/finally：一个或没有
'''


# def div_apple(n):
#     num=int(input('请输入要分的人数：'))  #可能会产生异常ValueError
#     cnt=n/num   #可能会产生异常ZeroDivisionError
#     print(n,'个苹果,分给',num,'个人，每人分得',cnt,'个')
#
# try:
#     div_apple(100)
# except ValueError as a:
#     print(a)
#     print('用户输入不合法')
# except ZeroDivisionError:
#     print('不能除以0')
# else:
#     print('没有发生异常')
# finally:
#     print('finally语句')

'''try:
    程序片段
finally:
    最终语句
finally 必须要有，不可以有expect，不管是否发生异常，最终都要执行finally。不会改变状态
做收尾的工作
'''

'''def cook():
    print('打开天然气')
    try:
     num=int(input('请输入你要煎鸡蛋的个数：'))
    finally:
     print('关闭天然气')
cook()
'''

#触发和断言
# 语法 raise 异常类型 或者 raise 异常对象
# 作用：人为的触发一个异常，让程序进入异常状态。
# def f():
#     print('f函数开始执行')
#     #raise ZeroDivisionError     #程序终止了
#     zero=ZeroDivisionError('不能除以0')
#     raise zero
#     print('f函数执行结束')
# f()

#断言
# 语法：assert 真值表达式,错误数据（通常是字符串）
# 作用：当表达式为false的时候，用错误数据创建出一个AssertionError（断言失败）对象，并且程序进入终止状态
'assert'
# def f():
#     print('f函数开始执行')
#     a=1
#     b=2
#     assert a>b,'断言是不是失败了？？'
#     print('f函数执行结束')
# try:
#     f()
# except AssertionError:
#     pass

'''try-expect:捕获异常进行处理，让程序不会因为异常进入终止状态
try-finally：不管是否发生异常，都要做一些事情，不会改变程序状态
raise assert：用于消息的发送
'''

#模拟造房子的过程
#打地基：如果打到地下水，发现了文物。就使用触发或者断言，让程序进入终止状态。
#盖房子：如果碰到高压线了，或者太高了（有机场）.
import random
def f1():    #打地基
    print('开始打地基')
    # if random.random()<0.4:   #打到地下水了
    #     raise ValueError
    # if random.random()>0.7:   #找到文物了
    #     raise ZeroDivisionError
    assert random.random()<0.4,'打到地下水了'
    assert random.random()>0.7,'找到文物了'
    print('地基完成')
try:
    f1()
except AssertionError as a:
    print(a)

def f2():   #盖房子
    print('开始盖房子')
    print('房子完成')

#文件操作
# 'r':只读  'w'：只写  'a':追加  'rb'：以二进制的形式进行只读
# 'wb':二进制的只写     'ab'：二进制形式进行追加
f=open('1.txt','r',encoding='UTF-8')
f.read()
f.read(1)
f.write('aa')
f.close()
f.seek()
